package com.zr.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.zr.dao.OrderSettingDao;
import com.zr.pojo.OrderSetting;
import com.zr.service.OrderSettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @auther zhaorui
 * @date 2019-11-28 - 13:45
 */
@Service(interfaceClass = OrderSettingService.class)
@Transactional
public class OrderSettingServiceImpl implements OrderSettingService {

    @Autowired
    private OrderSettingDao orderSettingDao;
    /**
     *
     * 参与的操作 根据日期查询数量
     *              根据日期进行更新
     *              插入操作
     *         逻辑 分析:
     *                 将数据导入到数据库中  可能出现的情况
     *                 第一种情况 如果数据库中没有这些数据 不存在重复的数据 则直接插入到数据库中  insert
     *                 第二种情况 如果数据库中存在相同日期的数据 则需要进行覆盖 -- > 也就是更新 update
     *
     *                 所以在添加数据之前需要 先和 数据库中已有的数据进行比较 查询中包含当前要导入数据日期的数量
     *                如果>0 则需要进行update操作
     *                 如果=0 则直接进行insert操作
     *
     * @param orderSettings
     */
    @Override
    public void add(List<OrderSetting> orderSettings) {
        //存在list集合的 数据  首先进行非空判断
        if (orderSettings.size() > 0 && orderSettings != null){
            //遍历集合 得到每个OderSetting对象
            for (OrderSetting orderSetting : orderSettings) {
                Date orderDate = orderSetting.getOrderDate();
                //通过orderDate查询 当前日期是否存在数据
                long count = orderSettingDao.getOrderSettingByDate(orderDate);
                //如果count >  0 则表明数据表中存在预约设置
                if (count > 0){
                    //需要进行更新操作
                    orderSettingDao.updateOrderSettingByDate(orderSetting);
                }else {
                    //等于0  就说明表中没有相关数据  直接进行插入操作
                    orderSettingDao.add(orderSetting);
                }
            }
        }
    }

    /**
     * <P>查询预约设置信息</P>
     *  分析:
     *      本功能 是为了将数据库中数据在动态的切换页面的时候显示当前页面的数据<br/>
     *                  (符合日历控件的时间比如:2019-11) 这也是前端传过来的参数 -- >  字符串数据<br/>
     *      查询当前月的预约数据:<br/>
     *          这是一个时间段的查询 需要使用到between and 来查询<br/>
     *          需要一个  begin 和 end  日期作为条件<br/>
     *      将条件封装到 map集合中  或者 在相关方法中直接使用@param()  注解来修饰<br/>
     *
     *      方法的返回值 是一个范行为OrderSetting的List集合 , 而前台展示的结果并不和OrderSetting中的一一映射<br/>
     *      所以在service中需要将List<OrderSetting>  转为List<Map><br/>
     *          方法两种: 1. 遍历集合 将对象中的属性赋值到对应的key中<br/>
     *                    2. 在xml中 使用resultMap接收结果 直接返回List<Map>
     *
     * @param date
     * @return
     */
    @Override
    public List<Map> findOrderSetting(String date) {

        //设置查询条件
        String begin = date +"-1";//将date后加上-1 作为本月的第一天
        String end = date +"-31";//将date后加上-31 作为本月的最后一天
        //创map 将begin和end 进行封装
        Map<String, String> map = new HashMap<>();
        map.put("begin",begin);
        map.put("end",end);
        //调用dao方法查询
        List<OrderSetting> list = orderSettingDao.findOrderSetting(map);
        //根据返回的结果可知 需要将 List<OrderSetting>  转换为List<Map> 的形式
        List<Map> data = new ArrayList<>();
        Map<String, Object> orderSettingMap = null;
        //遍历得到每个ordersetting对象
        for (OrderSetting orderSetting : list) {
            orderSettingMap = new HashMap<>();
            //{ date: 1, number: 120, reservations: 1 }-- > 要转换的数据结果形式
            orderSettingMap.put("date",orderSetting.getOrderDate().getDate());//getDate( )  获取天数
            orderSettingMap.put("number",orderSetting.getNumber());
            orderSettingMap.put("reservations",orderSetting.getReservations());
            //将每个map添加到list集合中
            data.add(orderSettingMap);
        }
        //将结果返回到controller层
        return data;
    }

    /**
     * 根据日期修改预约数量
     *  分析:
     *      在修改之前需要根据日期进行查询 是否存在该条数据
     *          如果不存在  则插入
     *          如果存在 则修改
     * @param orderSetting
     */
    @Override
    public void editByOrderDate(OrderSetting orderSetting) {
        //在修改之前需要根据日期进行查询 是否存在该条数据
            //通过orderDate查询 当前日期是否存在数据
        long count = orderSettingDao.getOrderSettingByDate(orderSetting.getOrderDate());
        if (count>0){
            //如果存在 修改数据
            //进行更新操作
            orderSettingDao.updateOrderSettingByDate(orderSetting);

        }else {
            //如果不存在  添加数据
            //当前日期没有进行预约设置，进行添加操作
            orderSettingDao.add(orderSetting);
        }
    }
}







